# coding=utf-8


exception_string = '请输入正确的类型!'


def count(s):
    """
    写函数，计算传入的字符串中数字、字母、空格、以及其他的个数
    :param s:
    :return: digit_num, char_num, space_num, others_num  or exception_string
    """
    digit_num = 0
    char_num = 0
    space_num = 0
    others_num = 0
    if isinstance(s, (str)):
        for i in s:
            if i.isdigit():
                digit_num += 1
            elif i.isalpha():
                char_num += 1
            elif i.isspace():
                space_num += 1
            else:
                others_num += 1
        return (digit_num, char_num, space_num, others_num)
    else:

        return exception_string


# 写函数检测用户传入的对象（字符、列表、元组）的每一个元素是否有空内容。

def is_space(args):
    result = False
    if isinstance(args, (str, list, tuple)):
        for i in args:
            if i == '':
                result = True
                break
        return result
    else:
        return exception_string


str1 = "dhn98f09f87f  * &"
list1 = ['1', 3, 4, 2, 'o', '']
dict1 = {'key1': 'val1', 'key2': '2', '': 'dd'}
res1 = count(str1)
res2 = count(list1)
print("计算传入的字符串中数字、字母、空格、以及其他的个数:")
print(res1)
print(res2)
print("检测用户传入的对象（字符、列表、元组）的每一个元素是否有空内容:")
print(is_space(str1))
print(is_space(list1))
print(is_space(dict1))


# 检查传入列表的长度，如果大于2，那么仅保留前两个长度的内容，并将新内容返回给调用者

def len_control(tmplist):
    """
    检查传入列表的长度，如果大于2，那么仅保留前两个长度的内容，并将新内容返回给调用者 by yanping.zhang
    :param tmplist:
    :return: tmplist[0:2] or exception_string
    """
    if isinstance(tmplist, (list)):
        if len(list1) > 2:
            return tmplist[0:2]
        else:
            return '列表长度小于等于2'
    else:
        return exception_string


print("返回两个长度的内容:")
print(len_control(str1))
print(len_control(list1))


# 检查获取传入列表或元组对象的所有奇数位索引对应的元素，并将其作为新列表返回给调用者

def getodd(args):
    """
    检查获取传入列表或元组对象的所有奇数位索引对应的元素，并将其作为新列表返回给调用者 by yanping.zhang
    :param args:
    :return: result or exception_string
    """
    # result = []
    if isinstance(args, (list, tuple)):

        ret = []
        for i in range(len(args)):
            if i % 2 == 1:
                ret.append(args[i])
            else:
                pass
        return ret
    else:
        return exception_string


list2 = [1, 33, 4, 5, 76, 7, 8]

print
getodd(list2)


# 检查传入字典的每一个value的长度,如果大于2，那么仅保留前两个长度的内容，并将新内容返回给调用者

def dict_len_control(args):
    """
    检查传入字典的每一个value的长度,如果大于2，那么仅保留前两个长度的内容，并将新内容返回给调用者 by yanping.zhang
    :param args:
    :return: ret or exception_string
    """
    if isinstance(args, (dict)):
        ret = {}
        for (k, v) in args.items():
            if len(v) > 2:
                ret[k] = v[0:2]
            else:
                ret[k] = v
        return ret
    else:
        return 'ddd'


dict1 = {"k1": "v1v1", "k2": [11, 22, 33, 44], "k3": "12"}
print
"返回两个长度的字典内容：：："
print
dict_len_control(dict1)


def guessnNum(args):
    """
    预设一个0~9之间的整数，让用户猜一猜并输入所猜的数，如果大于预设的数，显示“太大”；
    小于预设的数，显示“太小”，如此循环，直至猜中该数，显示“恭喜！你猜中了！”
    :param args:
    :return:
    """
    while True:
        reply = int(raw_input("Enter a number between 0 and 9: "))
        if reply == args:
            print
            "恭喜！你猜中了！"
            break
        elif reply > args:
            print
            "太大"
        else:
            print
            "太小"
            continue


guessnNum(6)


def function1(filename):
    """
    定义函数function1，计算每个学生的平均分（取整数），并将所有学生的学号 和平均分在屏幕上输出。
    :param filename:
    :return:
    """
    f = open(filename)
    a = f.readlines()

    list1 = []
    for line in a:
        line = line.strip()
        list2 = line.split()
        avg1 = int((int(list2[1]) + int(list2[2])) / 2)
        list1.append([list2[0], avg1])
    f.close()
    for list3 in list1:
        print(list3[0] + " " + str(list3[1]))


ret = function1("score.txt")


def calAvg(L):
    """
    计算平均分
    :param L:
    :return:avg_score
    """
    sum = 0
    count = 0
    for score in L:
        sum += score
        count += 1
    avg_score = int(sum / count)
    return avg_score


def scoreAvg(filename):
    """
    定义函数calAvg()，计算某一门课程的平均分（函数参数为某门课成绩对应的 列表名，返回值为该门课的平均分）
    :param filename:
    :return:
    """

    f = open(filename)
    a = f.readlines()
    l1 = []
    l2 = []
    for line in a:
        line = line.strip()
        l3 = line.split()
        l1.append(int(l3[1]))
        l2.append(int(l3[2]))
    f.close()

    print("课程一的平均分为：", calAvg(l1))
    print("课程二的平均分为：", calAvg(l2))


scoreAvg("score.txt")


def insertLlist(L, x):
    """
    主程序中已有一个排好序的列表，请编写函数insertList，
    将从键盘接收的整数按原来从小到大的排序规律插入到该列表中
    :param L:
    :param x:
    :return:L
    """
    if x > L[len(L) - 1]:
        L.append(x)
        return L
    else:
        for i in range(0, len(L)):
            if x < L[i]:
                L.insert(i, x)
                break
        return L


list4 = [1, 3, 5, 6, 7]
print
insertLlist(list4, 4)
